﻿namespace DimensionsHelper.Common.Contracts.Metadata;

/// <summary>
///     带有UUID的元数据对象。
/// </summary>
public interface IMetadataIdObject
{
    /// <summary>
    ///     对象定义的唯一编号。
    /// </summary>
    string Id { get; }
}

/// <summary>
///     可命名的元数据对象。
/// </summary>
public interface IMetadataLabeledObject : IMetadataNamedObject, IMetadataIdObject
{
    /// <summary>
    ///     获取或修改当前对象的文本描述，空白分为两种情况处理，如果此值为null，将输出 -，如果是空字符串，将输出 ""
    /// </summary>
    IMetadataLabels Label { get; }

    /// <summary>
    ///     样式设置。
    /// </summary>
    IStyles? Style { get; set; }

    /// <summary>
    ///     标签样式设置。
    /// </summary>
    IStyles? LabelStyle { get; set; }

    /// <summary>
    ///     模板设置。
    /// </summary>
    ITemplates Templates { get; }

    /// <summary>
    ///     当前对象的注释信息。
    /// </summary>
    INotes Notes { get; }

    /// <summary>
    ///     设置当前附加属性列表中的属性值，如果给定名称不存在，将创建一个新的，如果存在，将修改已有值。
    /// </summary>
    /// <param name="name">指定属性名，不区分大小写</param>
    /// <param name="value">给定字符串值，如果是null，则传入<see langword="null"/></param>
    void SetProperty(string name, string value);

    /// <summary>
    ///     设置当前附加属性列表中的属性值，如果给定名称不存在，将创建一个新的，如果存在，将修改已有值。
    /// </summary>
    /// <param name="name">指定属性名，不区分大小写</param>
    /// <param name="value">给定整型值</param>
    void SetProperty(string name, int value);

    /// <summary>
    ///     设置当前附加属性列表中的属性值，如果给定名称不存在，将创建一个新的，如果存在，将修改已有值。
    /// </summary>
    /// <param name="name">指定属性名，不区分大小写</param>
    /// <param name="value">给定双精度浮点值</param>
    void SetProperty(string name, double value);

    /// <summary>
    ///     设置当前附加属性列表中的属性值，如果给定名称不存在，将创建一个新的，如果存在，将修改已有值。
    /// </summary>
    /// <param name="name">指定属性名，不区分大小写</param>
    /// <param name="value">给定布尔值</param>
    void SetProperty(string name, bool value);

    /// <summary>
    ///     设置当前附加属性列表中的属性值，如果给定名称不存在，将创建一个新的，如果存在，将修改已有值。
    /// </summary>
    /// <param name="name">指定属性名，不区分大小写</param>
    /// <param name="property">给定次级属性</param>
    void SetProperty(string name, IProperty property);


    /// <summary>
    ///     设置当前附加属性列表中的属性值，如果给定名称不存在，将创建一个新的，如果存在，将修改已有值。
    /// </summary>
    /// <param name="name">指定属性名，不区分大小写</param>
    /// <param name="properties">给定次级属性列表</param>
    void SetProperty(string name, IProperties properties);
}